package cc.wanforme.text2class.handler;

import cc.wanforme.text2class.entity.AnalysisConfig;
import cc.wanforme.text2class.entity.BeanField;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 源数据解析成 BeanClass 和 BeanField，并添加部分 JPA注解
 * <code>><pre>
 *         String text = "xxxxxxxxxxx";
 *         String loc = "src/test/java";
 *
 *         AnalysisConfig config = new AnalysisConfig();
 *         ClassConfig classConfig = config.getClassConfig();
 *         classConfig.setPackageName("org.example.demo2.test.out");
 *         classConfig.setAnnotations("@Entity\n@Table");
 *         classConfig.setImports("import jakarta.persistence.Column;\n" +
 *                 "import jakarta.persistence.Entity;\n" +
 *                 "import jakarta.persistence.Table;\n" +
 *                 "import jakarta.persistence.Id;");
 *
 *         // 解析
 *         JpaDataAnalysis analysis = new JpaDataAnalysis();
 *         List<BeanField> list = analysis.analysis(text, config);
 *
 *         // 生成
 *         SimpleClassCreator creator = new SimpleClassCreator();
 *         creator.dataToClassAndSave(config, list, loc);
 *
 * </pre></code>
 */
public class JpaDataAnalysis extends BaseDataAnalysis {

    /** 前置处理 */
    @Override
    public String beforeAnalysis(String rawLine, AnalysisConfig config) {
        return rawLine;
    }

    /** 使用空格拆分元素
     * @param str 行数据
     * */
    @Override
    public List<String> cutElements(String str, AnalysisConfig config) {
        String [] items = str.trim().split(" ");
        boolean mergeWhiteSpace = config.isMergeWhiteSpace();
        List<String> arr = Arrays.stream(items).filter(s -> {
            if (mergeWhiteSpace) {
                return !s.trim().isEmpty();
            }
            return true;
        }).collect(Collectors.toList());

        return arr;
    }

    /** 获取属性名称。无效数据返回 null */
    @Override
    public String getName(String rawLine, List<String> items, AnalysisConfig config) {
        return items.size() > 1 ? items.get(0) : null;
    }

    /** 获取数据类型。无效数据返回 null */
    @Override
    public String getType(String rawLine, List<String> items, AnalysisConfig config) {
        if (items.size() < 2) {
            return null;
        }

        String type =  items.get(1);
        String dataType = type;
        return dataType;
    }

    /** 获取注释 */
    @Override
    public String getDesc(String rawLine, List<String> items, AnalysisConfig config) {
        return  items.size() > 2 ? items.get(2) : null;
    }

    /** 解析结果是否有效，根据这个结果设置最后的 valid */
    @Override
    protected boolean isValid(BeanField beanField, AnalysisConfig config) {
        return !BaseDataAnalysis.isBlank(beanField.getName()) && !BaseDataAnalysis.isBlank(beanField.getType());
    }

    /** 后置处理 */
    @Override
    public void afterAnalysis(BeanField beanField, List<String> items, AnalysisConfig config) {
        // 未处理部分
        String rawLine = beanField.getRawLine();
        if (rawLine.length()>2) {
            List<String> unArrs = items.subList(2, items.size());
            beanField.setUnResolve(String.join("", unArrs));
        }

        // 统一bean设置 jpa注解
        if ("id".equals(beanField.getName())) {
            beanField.setAnnotations("    @Id");
        } else {
            beanField.setAnnotations("    @Column");
        }
    }


}
